package connectx

import (
	"fmt"
	"google.golang.org/protobuf/compiler/protogen"
	"sync"
)

// 全局缓存，用于存储服务名称转换结果
var (
	methodNameCache sync.Map
)

type GlobalMethodName struct {
	MethodDescriptorName        string
	GetMethodFuncDescriptorName string
}

// GetGetMethodFuncDescriptorName 获取grpc_http接口名称
func GetGetMethodFuncDescriptorName(method *protogen.Method) string {
	// 直接使用ChangeServiceName函数，它内部已经处理了缓存逻辑
	return ChangeMethodName(method).GetMethodFuncDescriptorName
}

// GetMethodDescriptorName 获取grpc_http接口名称
func GetMethodDescriptorName(method *protogen.Method) string {
	// 直接使用ChangeServiceName函数，它内部已经处理了缓存逻辑
	return ChangeMethodName(method).MethodDescriptorName
}

// ChangeMethodName 函数的定义，带缓存机制
func ChangeMethodName(method *protogen.Method) GlobalMethodName {
	// 使用服务的完整名称作为缓存键
	cacheKey := method.Desc.FullName()

	// 先尝试从缓存中获取
	if cached, ok := methodNameCache.Load(cacheKey); ok {
		return cached.(GlobalMethodName)
	}

	// 缓存中没有，计算结果
	result := GlobalMethodName{
		MethodDescriptorName:        fmt.Sprintf("%s%sMethodDescriptor", method.Parent.GoName, method.GoName),
		GetMethodFuncDescriptorName: fmt.Sprintf("Get%sMethodDescriptor", method.GoName),
	}
	// 存储到缓存中
	methodNameCache.Store(cacheKey, result)

	return result
}
